﻿using System;
using YIJI_Device.Devices.smc304;

namespace YIJI_Device.Leisai
{
    public class Device_Smc304 : IDevice, IDisposable
    {
        short ret;                                  //错误码返回值
        ushort ConnectNo = 0;                       //连接号，可选 0--7
        ushort type = 2;                            //Type 链接类型：1-串口，2-网口
        string pconnectstring = "192.168.0.88";     //控制器 IP 地址
        uint baud = 0;
        ushort axis = 0;                            //轴号 0-控制器最大轴数-1
        ushort outmode = 0;                         //脉冲输出模式
        double equiv = 10;                          //脉冲当量
        double backlash = 10;                       //反向间隙
        ushort posi_mode = 0;                       //0:相对模式，1：绝对模式
        double read_pos;                            //读取指令脉冲计数器值


        ushort ioType = 0; //指定轴的 IO 信号类型为：正限位信号
        ushort MapIoType = 2; //轴 IO 映射类型：原点信号
        ushort MapIoIndex = 2; // 轴 IO 映射索引号：第 2 轴
        double filter = 0; //滤波时间

        public Device_Smc304()
        {

            ret = LTSMC.smc_board_init(ConnectNo, type, pconnectstring, baud);                          //2.1.1控制器连接初始化 
            if (ret != 0) throw new Exception($"执行错误,错误代码{(ERRORCODE)ret}");


            ret = LTSMC.smc_emg_stop(ConnectNo);
            if (ret != 0) throw new Exception($"执行错误,错误代码{(ERRORCODE)ret}");

            ret = LTSMC.smc_set_pulse_outmode(ConnectNo, axis, outmode);                                //2.1.2 设脉冲输出模式
            if (ret != 0) throw new Exception($"执行错误,错误代码{(ERRORCODE)ret}");

            ret = LTSMC.smc_set_equiv(ConnectNo, axis, equiv);                                          //2.1.3 设置脉冲当量值
            if (ret != 0) throw new Exception($"执行错误,错误代码{(ERRORCODE)ret}");

            ret = LTSMC.smc_set_backlash_unit(ConnectNo, axis, backlash);                               //2.1.4 设反向间隙值
            if (ret != 0) throw new Exception($"执行错误,错误代码{(ERRORCODE)ret}");
            //ret = LTSMC.smc_set_axis_io_map(ConnectNo, axis, ioType, MapIoType, MapIoIndex, filter);   //2.1.5 轴 IO 映射
            //if (ret != 0) throw new Exception($"执行错误,错误代码{(ERRORCODE)ret}");
        }

        //回原点
        public void HomeMove()
        {
            /*********************变量定义****************************/
            short ret = 0; //错误返回
            ushort ConnectNo = 0; //链接号，范围：0~7
            ushort axis = 0; //运动轴号，范围：0~最大轴数-1
            double Start_Vel = 1000;//回零起始速度，范围：0~2MHz 频率
            double Max_Vel = 1000; //回零运行速度，范围：0~2MHz 频率
            double Tacc = 0.1; //加速时间，单位 s，范围：0.001~10s
            ushort org_logic = 0; //设置原点有效电平：0-低电平，1-高电平
            double filter = 0; //滤波时间为 0，保留参数，无意义
            ushort home_dir = 1; //设置回原点方向：0-负向、1-正向
            ushort mode = 0; //设置回原点模式为一次回原点
            ushort Source = 0; // 设置计数源为脉冲计数
            ushort enable = 0; // 设置完成回原点后计数使能
            double position = 100; // 设置完成回原点后计数值
            /*********************函数调用执行**************************/
            //第一步、设置回原点电平参数
            ret = LTSMC.smc_set_home_pin_logic(ConnectNo, axis, org_logic, filter);
            //第二步、设置回原点模式
            ret = LTSMC.smc_set_homemode(ConnectNo, axis, home_dir, 1, mode, Source);
            //第三步、设置回原点完成后计数位置值
            ret = LTSMC.smc_set_home_position_unit(ConnectNo, axis, enable, position);
            //第四步、设置回原点运动速度参数
            ret = LTSMC.smc_set_home_profile_unit(ConnectNo, axis, Start_Vel, Max_Vel, Tacc, 0);
            //第五步、启动回原点运动
            ret = LTSMC.smc_home_move(ConnectNo, axis);

            
        }




        public void Dispose()
        {
            ret = LTSMC.smc_emg_stop(ConnectNo);
            if (ret != 0) throw new Exception($"执行错误,错误代码{(ERRORCODE)ret}");
            //throw new NotImplementedException();
            ret = LTSMC.smc_board_close(ConnectNo); //控制器关闭后，释放系统资源
            if (ret != 0) throw new Exception($"执行错误,错误代码{(ERRORCODE)ret}");

        }
    }
}
